package cn.lhjl.day04.note;
/*
*如果一个事物内部包含了另一个事物，那么这就是一个类内部包含了另一个类。
* 例如：身体和心脏的关系。又如：汽车和发动机的关系。
* 分类：
* 1.成员成员内部类。
* 2.局部内部类（包含你们内部类）
*
* 成员内部类的定义格式：
* 修饰符 class 外部类名称{
*      修饰符 class 内部类名称{
*            //...
*      }
*      //...
* }
* 注意：内用外，随意访问；外用内，需要内部类对象
* =============================================
* 使用成员内部类的两种方式：
* 1.直接方式：在外部类的方法中，使用内部类；然后main只是调用外部类方法。如Body类
* 2.直接方式，公式：
* 外部类名称.内部类名称 对象名 = new 外部类名称（）.new 内部类名称（）;
*
* 内部类的同名变量访问：
* 为了防止重名，在内部类的方法中要访问外部类的成员变量可以这么写： 外部类名称.this.外部类成员变量名
*
*
* 外部类
* 如果一个类是定义在方法内部的，那么这就是一个局部内部类。
* “局部”：只有当前所属的方法才能使用它，出了这个方法外面就不能用了。
* 定义格式：
* 修饰符 class 外部类名称{
*      修饰符 返回值类型 外部类方法名称（参数列表）{
*           class 局部内部类名称{
*                     //
*          }
*      }
* }
*
* 小节一下权限修饰符：
* 1.外部类名称前：只能写public/（default）
* 2.成员内部类：public protect default private都能写
* 3.局部内部类：什么都不能写
*
* 局部内部类，如果希望访问所在方法的局部变量，那么必须保证这个局部变量必须是【有final修饰的变量】
* 备注：jdk8开始，只要局部变量不变，那么可以省略final
* 原因：1.new出来的对象在堆内存当中
*      2.局部变量时跟着方法走的，在栈内存当中。
*      3.当方法运行结束后，立即出栈，局部变量也就跟着消失了。
*      4.但是new出来的对象持续存在于堆内存当中，直到垃圾回收。
* 注意事项：外部类方法中的局部变量最好别和局部内部类方法中的局部变量重名，这样无法访问外部类方法中的局部变量了
*
* 匿名内部类：
* 如果接口的实现类（或者是父类的子类）只需要使用唯一的一次，
* 那么这种情况下就可以省略该类的定义，而改为使用【匿名内部类】。
*
* 匿名内部类的定义格式：
* 接口名称 对象名 = new 接口名称{
*   //覆盖重写所有的抽象方法
* };
* 注意这个分号
*
* 对于以上格式：
* 1.new代表创建对象的动作
* 2.接口名称是匿名内部类需要实现的那个接口。
* 3.花括号你才是匿名内部类的内容
*
* 需要注意的几点问题：
* 1.匿名类内部类因为省略了类名，因此只能在用来创建一次对象，如果希望多次创建，那么需要单独定义实现类。
* 2.匿名对象因为省略了对象名，因此只能用它来调用一次方法/变量。如果希望多次调用这个对象的方法，必须给这个对象取名字。
* 3.综上两点，匿名内部类省略了【实现类/子类】名称,匿名对象省略了【对象名】。可以同时省略两者格式如：
*
*  new Animal(){

            @Override
            public void eat() {
                System.out.println("chi");
            }
        }.eat();
*
* 我的思考，一个实现类只用一次可以省略创建单独定义这个实现类这样的流程，转而直接在接口后补上花括号覆盖重写所有抽象方法，然后new出来
* 使用，一个对象如果我们只调用一次，那么我们可以省略给对象取名字的步骤，直接new出来.方法/变量 来使用。
*
*
* 成员变量是接口时候，set时候可以这样写（匿名内部类）
*  hero.setSkill(new Skill() {
            @Override
            public String show() {
                return "透体圣光";
            }
        });
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* */
public class 内部类 {
}
